package View;

import java.io.IOException;

import DAO.*;
import Pojo.Aluno;
import Pojo.Professor;

/** Classe de Operações Principais do Sistema.
*
* @author Thiago de Sousa Silveira
* 
* */
public class MenuPrincipal {
	private AlunoDaoImplArquivo alunoDao;
	private ProfessorDaoImplArquivo professorDao;
	private DisciplinaDaoImplArquivo disciplinaDao;
	private TurmaDaoImplArquivo turmaDao;
	private AtividadeDaoImplArquivo atividadeDao;
	private HistoricoDaoImplArquivo historicoDao;
	private HistoricoTurmaDaoImplArquivo historicoTurmaDao;
	private NotaDaoImplArquivo notaDao;
	private int acesso;
	private Professor professorAcesso;
	
	/**Setter de acesso referente ao sistema
	 * 
	 * @param acesso
	 */
	private void setAcesso(int acesso){
		this.acesso=acesso;
	}
	
	/**Getter de acesso referente ao sistema
	 * 
	 * @return int com o Acesso
	 */
	public int getAcesso(){
		return(this.acesso);
	}
	
	/**Setter de acesso referente ao sistema
	 * 
	 * @param professor
	 */
	private void setProfessorAcesso(Professor professor){
		this.professorAcesso = professor;
	}
	
	/**
	 * Getter de acesso referente ao sistema
	 * @return Professor logado no sistema
	 */
	private Professor getProfessorAcesso(){
		return(this.professorAcesso);
	}
	
	/**Chamada ao menu principal e exibição de opções.
	 * 
	 */
	public void chamadaMenuPrincipal(){
		
		//Criando os objetos DAO
		this.alunoDao = new AlunoDaoImplArquivo();
		this.professorDao = new ProfessorDaoImplArquivo();
		this.disciplinaDao = new DisciplinaDaoImplArquivo();
		this.turmaDao = new TurmaDaoImplArquivo();
		this.atividadeDao = new AtividadeDaoImplArquivo();
		this.historicoDao = new HistoricoDaoImplArquivo();
		this.historicoTurmaDao = new HistoricoTurmaDaoImplArquivo();
		this.notaDao = new NotaDaoImplArquivo();
		
		while(true){
			//Definindo o nível de acesso
			System.out.println("Bem vindo ao Sistema Acadêmico da UFLN");
			System.out.println("-----Informe seu usuário-----");
			System.out.println("1 - Administrador");
			System.out.println("2 - Professor");
			System.out.println("0 - Sair");
			this.setAcesso(Console.readInteger());
			
			//Se o usuário pedir para sair
			if (this.getAcesso()==0){
				break;
			}
			
			//definindo o atributo professorAcesso
			if (this.getAcesso() == 2){
				this.setProfessorAcesso(this.logarComoProfessor()); 
			}else{
				this.setProfessorAcesso(null);
			}
			
			//Mostrar o cadastro
			if ((this.getAcesso() == 1)||((this.getAcesso() == 2)&&(this.getProfessorAcesso()!=null))||(this.getAcesso() == 3)){
				int opcao=1;
				while(opcao!=0){
					System.out.println("-----Sistema Acadêmico-----");
					if (this.getAcesso()==1){
						System.out.println("Logado como: Administrador");
					}else if (this.getAcesso()==2){
						System.out.println("Logado como: Professor "+this.getProfessorAcesso().getNome());
					}
					System.out.println("Escolha sua opção:");
					System.out.println("1- Cadastros");
					System.out.println("2- Visualizar Informações");
					System.out.println("3- Consultas");
					System.out.println("0- Sair");
					opcao = Console.readInteger();
					if (opcao==1){
						this.cadastros();
					} else if (opcao==2){
						this.listarInformacoes();
					}else if (opcao==3){
						this.consultas();
					}
				}
			}
		
		}
		System.out.println("Até mais e obrigado por usar nosso programa.");
	}
	
	/**Listagem de professores para escolha.
	 * 
	 * @return Professor com o professor selecionado.
	 */
	private Professor logarComoProfessor(){
		MenuProfessor menuProfessor = new MenuProfessor();
		if (menuProfessor.escolherProfessores(this.professorDao)>0){
			int idProfessor = Console.readInteger();
			return(this.professorDao.procurarPorId(idProfessor));
		}else{
			System.out.println("Nenhum professor cadastrado. Por favor cadastre algum para logar como professor.\nPressione Enter para continuar.");
			Console.readString();
			return(null);
		}
	}
		
	/**Menu de cadastros
	 * 
	 */
	private void cadastros(){
		int opcao;
		if (this.getAcesso()==1){
			System.out.println("-----Cadastros-----");
			System.out.println("1- Cadastrar Alunos");
			System.out.println("2- Cadastrar Professores");
			System.out.println("3- Cadastrar Disciplinas");
			System.out.println("4- Cadastrar Turmas");
			System.out.println("0- Voltar ao Menu Principal");
			opcao = Console.readInteger();
			if (opcao == 1){
				MenuAluno menuAluno = new MenuAluno();
				menuAluno.cadastrarAlunos(this.alunoDao);
			}else if (opcao == 2){
				MenuProfessor menuProfessor = new MenuProfessor();
				menuProfessor.cadastrarProfessores(this.professorDao);
			}else if (opcao == 3){
				MenuDisciplina menuDisciplina = new MenuDisciplina();
				menuDisciplina.cadastrarDisciplinas(this.disciplinaDao);
			}else if (opcao == 4){
				MenuTurma menuTurma = new MenuTurma();
				menuTurma.cadastrarTurmas(this.turmaDao, this.professorDao, this.disciplinaDao,this.alunoDao, this.historicoTurmaDao);
			}
		}else if (this.getAcesso()==2){
			System.out.println("-----Cadastros-----");
			System.out.println("1- Cadastrar Atividades");
			System.out.println("2- Lançar Notas");
			System.out.println("3- Fechar Turma");
			System.out.println("0- Voltar ao Menu Principal");
			opcao = Console.readInteger();
			if (opcao == 1){
				MenuAtividade menuAtividade = new MenuAtividade();
				menuAtividade.cadastrarAtividades(this.atividadeDao, this.turmaDao, this.professorAcesso);
			} else if (opcao == 2){
				MenuNota menuNota = new MenuNota();
				menuNota.lancarNota(this.notaDao, this.professorDao, this.professorAcesso, this.turmaDao, this.atividadeDao,this.alunoDao,this.historicoTurmaDao);
			} else if (opcao == 3){
				MenuTurma menuTurma = new MenuTurma();
				menuTurma.fecharTurmas(this.professorAcesso, this.turmaDao, this.atividadeDao, this.disciplinaDao, this.alunoDao, this.historicoTurmaDao, this.notaDao, this.historicoDao);
			}
		}
	}
	
	/**Menu de listagem de informações.
	 * 
	 */
	private void listarInformacoes(){
		System.out.println("-----Listar Informações-----");
		System.out.println("1 - Listar Alunos");
		System.out.println("2 - Listar Professores");
		System.out.println("3 - Listar Disciplinas");
		System.out.println("4 - Listar Turma");
		System.out.println("5 - Listar Atividades");
		System.out.println("0 - Voltar ao menu principal");
		int opcao = Console.readInteger();
		if (opcao==1){
			MenuAluno menuAluno = new MenuAluno();
			menuAluno.listarAlunos(this.alunoDao);
		}else if (opcao==2){
			MenuProfessor menuProfessor = new MenuProfessor();
			menuProfessor.listarProfessores(this.professorDao);
		}else if (opcao==3){
			MenuDisciplina menuDisciplina = new MenuDisciplina();
			menuDisciplina.listarDisciplinas(this.disciplinaDao);
		}else if (opcao==4){
			MenuTurma menuTurma = new MenuTurma();
			menuTurma.listarTurmas(this.turmaDao);
		}else if (opcao==5){
			MenuAtividade menuAtividade = new MenuAtividade();
			menuAtividade.listarAtividades(this.atividadeDao);
		}
	}
	
	/**Menu de consultas.
	 * 
	 */
	public void consultas(){
		System.out.println("----- Consultas -----");
		System.out.println("1 - Consultar Turmas");
		System.out.println("2 - Consultar Situação de Aluno");
		System.out.println("3 - Consultar Número de Turmas Oferecidas em uma Disciplina");
		System.out.println("4 - Consultar Disciplinas Lecionadas por um Professor");
		int opcao = Console.readInteger();
		if (opcao==1){
			MenuTurma menuTurma = new MenuTurma();
			menuTurma.consultarTurmas(this.turmaDao,this.disciplinaDao,this.historicoTurmaDao);
		}else if (opcao==2){
			MenuDisciplina menuDisciplina = new MenuDisciplina();
			menuDisciplina.consultarSituacaoAluno(this.disciplinaDao,this.alunoDao,this.historicoDao,this.historicoTurmaDao);
		}else if (opcao==3){
			MenuDisciplina menuDisciplina = new MenuDisciplina();
			menuDisciplina.calcularQtdTurmasParaDisciplina(this.disciplinaDao,this.turmaDao);
		}else if (opcao==4){
			MenuProfessor menuProfessor = new MenuProfessor();
			menuProfessor.calcularQtdTurmasParaProfessor(this.professorDao);
		}
	}
}
